package com.ffggffgfv.backend.service;

import com.ffggffgfv.backend.dto.*;
import com.ffggffgfv.backend.entity.Order;

/**
 * 订单服务接口
 */
public interface OrderService {

    /**
     * 创建订单
     *
     * @param userId         用户ID
     * @param orderCreateDTO 订单创建信息
     * @return 订单号
     */
    String createOrder(Long userId, OrderCreateDTO orderCreateDTO);

    /**
     * 获取订单详情
     *
     * @param userId  用户ID
     * @param orderNo 订单号
     * @return 订单详情
     */
    OrderDetailDTO getOrderDetail(Long userId, String orderNo);

    /**
     * 获取用户的订单列表
     *
     * @param userId   用户ID
     * @param pageNum  页码
     * @param pageSize 每页数量
     * @return 分页订单列表
     */
    PageResult<Order> getUserOrders(Long userId, int pageNum, int pageSize);

    /**
     * 条件查询订单
     *
     * @param queryDTO 查询条件
     * @return 分页订单列表
     */
    PageResult<Order> getOrdersByCondition(OrderQueryDTO queryDTO);

    /**
     * 取消订单
     *
     * @param userId  用户ID
     * @param orderNo 订单号
     * @return 是否成功
     */
    boolean cancelOrder(Long userId, String orderNo);

    /**
     * 支付订单
     *
     * @param userId     用户ID
     * @param paymentDTO 支付信息
     * @return 是否成功
     */
    boolean payOrder(Long userId, PaymentDTO paymentDTO);

    /**
     * 确认收货
     *
     * @param userId  用户ID
     * @param orderNo 订单号
     * @return 是否成功
     */
    boolean confirmReceipt(Long userId, String orderNo);

    /**
     * 关闭超时未支付的订单
     *
     * @param timeoutMinutes 超时时间（分钟）
     * @return 处理的订单数
     */
    int closeTimeoutOrders(int timeoutMinutes);

    /**
     * 处理订单发货
     *
     * @param orderNo         订单号
     * @param trackingNo      物流单号
     * @param shippingCompany 物流公司
     * @return 是否成功
     */
    boolean shipOrder(String orderNo, String trackingNo, String shippingCompany);

    /**
     * 根据订单号获取订单
     *
     * @param orderNo 订单号
     * @return 订单实体
     */
    Order getOrderByOrderNo(String orderNo);    /**
     * 根据订单号更新订单状态
     *
     * @param orderNo 订单号
     * @param status  新状态
     * @param tradeNo 支付宝交易号（可选）
     * @return 是否成功
     */
    boolean updateOrderStatusByOrderNo(String orderNo, Integer status, String tradeNo);
}
